<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 浅复制:两个变量引用同一片内存地址(空间) => 只要有一个改动 另一个也会收到影响
    // var arr = [1, 2, 3];
    // var brr = arr;  // 两个变量引用同一片内存地址(空间)
    // brr.push(4);
    // console.log(arr, brr, arr === brr);

    // 深复制: 得到一个与原数组元素相同的新数组 (浅拷贝 深拷贝)
    // 那么如何得到一个与原数组元素相同的新数组

    // 浅拷贝: 创建一个新的数组,遍历原数组中的每一个元素, 如果是值类型,将值直接放到新数组中,如果是引用类型,将该数据的引用地址 放到新数组中  (可以理解为只复制一层)
    // (1) 创建一个新数组 遍历原数组中的的每个元素,放到新数组中
    // (2) 借助数组的方法 concat() slice() map()


    // var arr = [1, 2, 3];
    // var brr = [];
    // for (var i = 0; i < arr.length; i++) {
    //     var item = arr[i];// 1 2 3
    //     brr.push(item);
    // }

    // var arr = [1, 2, 3];
    // var brr = arr.concat();
    // var brr = arr.slice();
    // var brr = arr.map(function (item) {
    //     return item;
    // })
    // console.log(arr, brr, arr === brr);


    // 问题:
    // var arr = [1, 2, 3, [4, 5, 6]];
    // var brr = [];
    // for (var i = 0; i < arr.length; i++) {
    //     var item = arr[i];// 1 2 3 [4, 5, 6]
    //     brr.push(item);
    // }
    // console.log(arr, brr, arr === brr);
    // console.log(arr[3], brr[3], arr[3] === brr[3]);


    // 深拷贝:创建一个新的数组,遍历原数组中的每一个元素放到新数组中, 如果是值类型,将值直接放到新数组中,如果是引用类型,将该数据的拷贝放到新数组中  (如果有多层,也会被拷贝)

    // Array.isArray()  构造函数Array的方法 Array.isArray()

    // var arr = [1, 2, 3, [4, 5, 6]];
    // var brr = [];
    // for (var i = 0; i < arr.length; i++) {
    //     var item = arr[i];// 1 2 3 [4, 5, 6]
    //     if (Array.isArray(item)) { // 如果是数组,将该数组在拷贝一份放到新数组中
    //         var crr = [];
    //         for (var j = 0; j < item.length; j++) {
    //             var each = item[j];
    //             crr.push(each);
    //         }
    //         brr.push(crr);
    //     } else {  // 不是数组 直接放
    //         brr.push(item);
    //     }
    // }
    // console.log(arr, brr, arr === brr);
    // console.log(arr[3], brr[3], arr[3] === brr[3]);
    // console.log(arr[3][3], brr[3][3], arr[3][3] === brr[3][3]);



    function deepCopy(arr) {
        // [1, 2, 3, [4, 5, 6, [7, 8, 9]]] => [1,2,3]
        // [4, 5, 6, [7, 8, 9]]   => [4,5,6]
        // [7, 8, 9]  => [7, 8, 9]
        var list = [];
        for (var i = 0; i < arr.length; i++) { // 遍历arr => 获取每个元素
            var item = arr[i];// 
            if (Array.isArray(item)) { // 如果是数组,将该数组在拷贝一份再放到新数组中
                var newArr = deepCopy(item);  // 
                list.push(newArr);
            } else {  // 不是数组 直接放
                list.push(item);
            }
        }
        return list;
    }

    debugger;
    var arr = [1, 2, 3, [4, 5, 6, [7, 8, 9]]];

    var brr = deepCopy(arr);
    console.log(arr, brr, arr === brr);
    console.log(arr[3], brr[3], arr[3] === brr[3]);
    console.log(arr[3][3], brr[3][3], arr[3][3] === brr[3][3]);







</script>

</html>